package Proxy;

import java.lang.reflect.Method;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

public class CglibTest {

    public static void main(String[] args) {

        // 通过CGLIB动态代理获取代理对象的过程
        // 创建Enhancer对象，类似于JDK动态代理的Proxy类
        Enhancer enhancer = new Enhancer();
        // 设置目标类的字节码文件
        enhancer.setSuperclass(Dao.class);
        // 设置回调函数
        enhancer.setCallback(new DaoProxy());
        // create方法正式创建代理类
        Dao userDao = (Dao) enhancer.create();
        // 调用代理类的具体业务方法
        userDao.update();
        userDao.select();
    }
}
class Dao {
    
    public void update() {
        System.out.println("PeopleDao.update()");
    }
    
    public void select() {
        System.out.println("PeopleDao.select()");
    }
}

class DaoProxy implements MethodInterceptor {

    @Override
    public Object intercept(Object object, Method method, Object[] objects, MethodProxy proxy) throws Throwable {
        System.out.println("Before Method Invoke");
        proxy.invokeSuper(object, objects);
        System.out.println("After Method Invoke");
        
        return object;
    }
    
}

///**
// * @author sec
// * @version 1.0
// * @date 2020/3/24 8:14 上午
// **/
//class LogInterceptor implements MethodInterceptor {
//
//    /**
//     *
//     * @param obj 表示要进行增强的对象
//     * @param method 表示拦截的方法
//     * @param objects 数组表示参数列表，基本数据类型需要传入其包装类型，如int-->Integer、long-Long、double-->Double
//     * @param methodProxy 表示对方法的代理，invokeSuper方法表示对被代理对象方法的调用
//     * @return 执行结果
//     * @throws Throwable 异常
//     */
//    //@Override
//    public Object intercept(Object obj, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
//        before(method.getName());
//        // 注意这里是调用invokeSuper而不是invoke，否则死循环;
//        // methodProxy.invokeSuper执行的是原始类的方法;
//        // method.invoke执行的是子类的方法;
//        Object result = methodProxy.invokeSuper(obj, objects);
//        after(method.getName());
//        return result;
//    }
//
//    /**
//     * 调用invoke方法之前执行
//     */
//    private void before(String methodName) {
//        System.out.println("调用方法" + methodName +"之【前】的日志处理");
//    }
//
//    /**
//     * 调用invoke方法之后执行
//     */
//    private void after(String methodName) {
//        System.out.println("调用方法" + methodName +"之【后】的日志处理");
//    }
//}
